/* Shift-JIS */
/* UTF-8 */
/********************************************************************************/
/*ソース名:                                                                       */
/*　　coredef.h                                                                  */
/*機能:                                                                         */
/*　　 コアの内部で使われる定数と変数と関数を定義する 　　                                                                                     */
/*作成者:                                                                       */
/*　　2009/08/05 ト（CBSﾃｸﾉ）                                                                                                                                       */
/********************************************************************************/
/*変更履歴:                                                                     */
/*　　2009/08/05 ト（CBSﾃｸﾉ）　　新規作成                                                                                                             */
/*  2010/6     関（CBSテクノ）　COXから流用し、修正した。　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　*/
/********************************************************************************/
#ifndef COREDEF_H_
#define COREDEF_H_
#include <stdio.h>
#include <string.h>
#include <stdarg.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <time.h>
#include <errno.h>
#include "typedef.h"
#include "Id.h"
#include "lib_func.h"
#include "core.h"
#include "encode.h"
#include "./textfile/pf_file.h"
#include "./memory/mem_interface.h"
#include "../alert/alert.h"
#include "../inc/core_internal.h"
#include "../table/core_table.h"
#include "./mpu/mpu.h"
/**********[共用マクロ]**************************************************************/


#define FATAL_ON_X(x, f)		if ((x) == (f)) return COEXIT_FATAL
#define FATAL_NOT_X(x, f)		if ((x) != (f)) return COEXIT_FATAL

#define FATAL_ON_ZERO(f)		FATAL_ON_X(0, f)
#define FATAL_ON_FALSE(f)		FATAL_ON_X(FALSE, f);
#define FATAL_ON_FATAL(f)		FATAL_ON_X(COEXIT_FATAL, f);

#define MIN_ABSDOUBLE		 (3.351e-38)
#define ISEQUALDOUBLE(a,b) ((( (a) - (b) ) <= MIN_ABSDOUBLE) && ( ( (b ) - (a ) ) <= MIN_ABSDOUBLE ) )

#define IS16BIT  (INTSIZE==SHORTSIZE)



#define SYMBOL_KIND_MEMBER  1
#define SYMBOL_KIND_PARAM   2
#define SYMBOL_KIND_TAG     3
#define SYMBOL_KIND_LABEL   4
#define SYMBOL_KIND_TYPEDEFID 5
#define SYMBOL_KIND_ENUMCONST 6
#define SYMBOL_KIND_FUNCTION  7
#define SYMBOL_KIND_VARIABLE  8

#define TYPEKIND_BASIC			1	/* 通常の型			*/
#define TYPEKIND_ARRAY			2	/* 配列				*/
#define TYPEKIND_POINTER		3	/* ﾎﾟｲﾝﾀ			*/
#define TYPEKIND_STRUCT			4	/* 構造体			*/
#define TYPEKIND_UNION			5	/* 共用体			*/
#define TYPEKIND_ENUM			6	/* 列挙型			*/
#define TYPEKIND_FUNCTION		7	/* 関数(実体)			*/
#define TYPEKIND_BITFIELD		8	/* BitField型			*/

#define xPPTOKEN_END			1
#define xPPTOKEN_HSPACE    		2
#define xPPTOKEN_VSPACE    		3
#define xPPTOKEN_NEXTLINE		4
#define xPPTOKEN_PPNUM   		5
#define xPPTOKEN_CHAR   		6
#define xPPTOKEN_STR   			7
#define xPPTOKEN_SYM			8
#define xPPTOKEN_HEADER  		9
#define xPPTOKEN_LONG			10
#define xPPTOKEN_ULONG			11
#define xPPTOKEN_DOUBLE			12
#define xPPTOKEN_OTHER			13
#define xPPTOKEN_EQUEQU			( xPPTOKEN_OTHER + 1 )
#define xPPTOKEN_EQU			( xPPTOKEN_OTHER + 2 )
#define xPPTOKEN_NOTEQU			( xPPTOKEN_OTHER + 3 )
#define xPPTOKEN_NOT			( xPPTOKEN_OTHER + 4 )
#define xPPTOKEN_POINTERMEM			( xPPTOKEN_OTHER + 5 )
#define xPPTOKEN_DEC			( xPPTOKEN_OTHER + 6 )
#define xPPTOKEN_SUBEQU			( xPPTOKEN_OTHER + 7 )
#define xPPTOKEN_SUB			( xPPTOKEN_OTHER + 8 )
#define xPPTOKEN_INC			( xPPTOKEN_OTHER + 9 )
#define xPPTOKEN_ADDEQU			( xPPTOKEN_OTHER + 10 )
#define xPPTOKEN_ADD			( xPPTOKEN_OTHER + 11 )
#define xPPTOKEN_LSHTEQU			( xPPTOKEN_OTHER + 12 )
#define xPPTOKEN_LSHT			( xPPTOKEN_OTHER + 13 )
#define xPPTOKEN_LESSEQU			( xPPTOKEN_OTHER + 14 )
#define xPPTOKEN_LESS			( xPPTOKEN_OTHER + 15 )
#define xPPTOKEN_RSHTEQU			( xPPTOKEN_OTHER + 16 )
#define xPPTOKEN_RSHT			( xPPTOKEN_OTHER + 17 )
#define xPPTOKEN_MOREEQU			( xPPTOKEN_OTHER + 18 )
#define xPPTOKEN_MORE			( xPPTOKEN_OTHER + 19 )
#define xPPTOKEN_OROR			( xPPTOKEN_OTHER + 20 )
#define xPPTOKEN_OREQU			( xPPTOKEN_OTHER + 21 )
#define xPPTOKEN_OR			( xPPTOKEN_OTHER + 22 )
#define xPPTOKEN_ANDAND			( xPPTOKEN_OTHER + 23 )
#define xPPTOKEN_ANDEQU			( xPPTOKEN_OTHER + 24 )
#define xPPTOKEN_AND			( xPPTOKEN_OTHER + 25 )
#define xPPTOKEN_MULEQU			( xPPTOKEN_OTHER + 26 )
#define xPPTOKEN_MUL			( xPPTOKEN_OTHER + 27 )
#define xPPTOKEN_DIVEQU			( xPPTOKEN_OTHER + 28 )
#define xPPTOKEN_DIV			( xPPTOKEN_OTHER + 29 )
#define xPPTOKEN_MODEQU			( xPPTOKEN_OTHER + 30 )
#define xPPTOKEN_MOD			( xPPTOKEN_OTHER + 31 )
#define xPPTOKEN_XOREQU			( xPPTOKEN_OTHER + 32 )
#define xPPTOKEN_XOR			( xPPTOKEN_OTHER + 33 )
#define xPPTOKEN_SHARPSHARP			( xPPTOKEN_OTHER + 34 )
#define xPPTOKEN_SHARP			( xPPTOKEN_OTHER + 35 )
#define xPPTOKEN_ELLIPSIS			( xPPTOKEN_OTHER + 36 )
#define xPPTOKEN_DOT			( xPPTOKEN_OTHER + 37 )
#define xPPTOKEN_OPENARRAY			( xPPTOKEN_OTHER + 38 )
#define xPPTOKEN_CLOSEARRAY			( xPPTOKEN_OTHER + 39 )
#define xPPTOKEN_OPENPAREN			( xPPTOKEN_OTHER + 40 )
#define xPPTOKEN_CLOSEPAREN			( xPPTOKEN_OTHER + 41 )
#define xPPTOKEN_NEG			( xPPTOKEN_OTHER + 42 )
#define xPPTOKEN_QUESTION			( xPPTOKEN_OTHER + 43 )
#define xPPTOKEN_COLON			( xPPTOKEN_OTHER + 44 )
#define xPPTOKEN_COMMA			( xPPTOKEN_OTHER + 45 )
#define xPPTOKEN_OPENBLOCK			( xPPTOKEN_OTHER + 46 )
#define xPPTOKEN_CLOSEBLOCK			( xPPTOKEN_OTHER + 47 )
#define xPPTOKEN_SEMICOLON			( xPPTOKEN_OTHER + 48 )
#define xPPTOKEN_PRAGMABEGIN		( xPPTOKEN_OTHER + 49 )
#define xPPTOKEN_PRAGMAEND		( xPPTOKEN_OTHER + 50 )
#define xPPTOKEN_PLUS			( xPPTOKEN_OTHER + 51 )
#define xPPTOKEN_MINUS			( xPPTOKEN_OTHER + 52 )





#define LINK_UNSURE  0
#define LINK_EXTERN  1
#define LINK_INTERN  2

/*******************************************************/
/* 定義種類                                                           		           */
/*******************************************************/
#define xDECKIND_DECLARATION      1
#define xDECKIND_DEFINITION       2
#define xDECKIND_TENDEFINITION    3

/**********************************************************
 * テーブル種類定義
 **********************************************************/

enum _TABLE_KIND_TAG_{
 KIND_ERROR=0,
 KIND_FILEINFO		,
 KIND_CODESCOPE			,
 KIND_LINKAGE		,
 KIND_TYPEDEFINFO		,
 KIND_SYMDEFINFO		,
 KIND_VALUEINFO			,
 KIND_DECLARATION		,
 KIND_TYPESPECIFIER		,
 KIND_DECLARATOR		,
 KIND_INITIALEXPLIST	,
 KIND_STATEMENTINFO		,
 KIND_EXPRESSIONINFO	,
 KIND_INITDESIGNATION
};

#ifndef __RBTREE_TYPEDEF__
#define __RBTREE_TYPEDEF__
typedef struct __REDBACKTREE{
	AST	astParent;			/* 1 */
	AST astLeftChild;			/* 2 */
	AST	astRightChild;			/* 3 */
	AST	lColor;				/* 4 */
}RBTREE;
#endif





/* コールバック関数の定義 */
extern S4 (*pExecRuleChecker)( U2, AST, U4 );

extern AST	astPreValueMax;
extern S2	sCoreProc;

typedef struct _MEMOPENINFO
{
	U2	usKind;		/* テーブルID　*/
	AST		astLimit;	/* 最大確保値  */
}MEMOPENINFO;

extern U4 (*cpuDeclStructSize)( U2 ,  AST , U4 * );
extern U2 gblErrOutput;
S4  CCoreThrowWarning( U4 code, AST astCodeScp, PSZ pszParameter, ALERT_MSG_PARAM * szValue );
AST  CCoreGetCurrTranslatioUnit( VOID );
//BOOL  CcTypeIsBasicType( AST type );
AST CcTypeGetOrign( AST astType );
U4   MemGetAccessErrCode( U2 *kind, U2 *key, U2 *func, U2 *code );
S4   MemAddCoreMemTableCtrl( U2 usCoreProc );
AST  CppResultGetFirstPPToken( AST astTranslationUnit );
AST CppResultGetCurrPPToken( VOID );
AST CppResultGetNextPPToken( VOID );
VOID CcLinkageSet( AST astSym, AST declarator );
AST  NewLinkage( AST astSym, U2 defKind, U2 memClass );
PSZ CCoreGetOptKey( U2 u2OptID );

VOID COptionInfoInit(VOID);

VOID CCodeScopeInit(VOID);
/*debug,12/10/16,S*/
VOID CFileIndexInit(VOID);
/*debug,12/10/16,E*/
VOID CDirectiveInfoInit(VOID);
VOID CMacroInfoInit(VOID);
VOID CRepListTokenInit(VOID);
VOID CPPCondExpInit(VOID);
VOID CPPTokenListInit(VOID);
VOID CPPCondExpKindInit(VOID);
VOID CPPPostfixOpKindInit(VOID);
VOID CPPUnaryOpKindInit(VOID);
VOID CPPMultiOpKindInit(VOID);
VOID CPPAdditiveOpKindInit(VOID);
VOID CPPShiftOpKindInit(VOID);
VOID CPPRelationalOpKindInit(VOID);
VOID CPPEqualityOpKindInit(VOID);
VOID CPPAssignOpKindInit(VOID);

VOID CDeclarationInit(VOID);
VOID CTypeSpecifierInit(VOID);
VOID CDeclaratorInit(VOID);
VOID CStatementInit(VOID);
VOID CExpressionInit(VOID);
VOID CExpressionOpKindInit(VOID);
VOID CPostfixOpKindInit(VOID);
VOID CUnaryOpKindInit(VOID);
VOID CMultiOpKindInit(VOID);
VOID CAdditiveOpKindInit(VOID);
VOID CShiftOpKindInit(VOID);
VOID CRelationalOpKindInit(VOID);
VOID CEqualityOpKindInit(VOID);
VOID CConditionOpKindInit(VOID);
VOID CAssignOpKindInit(VOID);
VOID CTypeInfoInit(VOID);
VOID CSymbolInit(VOID);
VOID CValueInfoInit(VOID);
VOID CDesignationInit( VOID );
VOID CInitializerInit( VOID );
VOID CUniteChainInit(VOID);
VOID CTranslationUnitInit(VOID);
VOID CStringsInit(VOID);
VOID CLinkageInit(VOID);

//VOID LinkTranslationUnitInit(VOID);
VOID LinkStringsInit(VOID);
VOID LinkTypeInfoInit(VOID);
VOID LinkMemberInit(VOID);
VOID LinkConstantInit(VOID);
VOID LinkGblLinkageInit(VOID);
VOID LinkVariableInit(VOID);
VOID LinkFunctionInit(VOID);
VOID LinkCommandListInit(VOID);
VOID LinkOperandInit( VOID );

VOID TraceCmdListMetaDataInit(VOID);
VOID TracePathInfoInit(VOID);
VOID TraceLoopInfoInit( VOID );
#endif /*COREDEF_H_*/
